home *** CD-ROM | disk | FTP | other *** search
/ Amiga Plus 1997 #1 / Amiga Plus CD - 1997 - No. 01.iso / pd / programmierung / mesa-1.2.8 / src-tk / window.c < prev   
C/C++ Source or Header  |  1996-05-27  |  19KB  |  576 lines

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include "gltk.h"
  5. #include "private.h"
  6.  
  7. /******************************************************************************/
  8.  
  9. Display *xDisplay = 0;
  10. int xScreen = 0; 
  11. Window wRoot = 0;
  12. Atom deleteWindowAtom;
  13. WINDOW_REC w = {
  14.     0, 0, 300, 300, TK_RGB|TK_SINGLE|TK_DIRECT
  15. };
  16. float colorMaps[] = {
  17.     0.000000, 1.000000, 0.000000, 1.000000, 0.000000, 1.000000, 
  18.     0.000000, 1.000000, 0.333333, 0.776471, 0.443137, 0.556863, 
  19.     0.443137, 0.556863, 0.219608, 0.666667, 0.666667, 0.333333, 
  20.     0.666667, 0.333333, 0.666667, 0.333333, 0.666667, 0.333333, 
  21.     0.666667, 0.333333, 0.666667, 0.333333, 0.666667, 0.333333, 
  22.     0.666667, 0.333333, 0.039216, 0.078431, 0.117647, 0.156863, 
  23.     0.200000, 0.239216, 0.278431, 0.317647, 0.356863, 0.400000, 
  24.     0.439216, 0.478431, 0.517647, 0.556863, 0.600000, 0.639216, 
  25.     0.678431, 0.717647, 0.756863, 0.800000, 0.839216, 0.878431, 
  26.     0.917647, 0.956863, 0.000000, 0.000000, 0.000000, 0.000000, 
  27.     0.000000, 0.000000, 0.000000, 0.000000, 0.247059, 0.247059, 
  28.     0.247059, 0.247059, 0.247059, 0.247059, 0.247059, 0.247059, 
  29.     0.498039, 0.498039, 0.498039, 0.498039, 0.498039, 0.498039, 
  30.     0.498039, 0.498039, 0.749020, 0.749020, 0.749020, 0.749020, 
  31.     0.749020, 0.749020, 0.749020, 0.749020, 1.000000, 1.000000, 
  32.     1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 
  33.     0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 
  34.     0.000000, 0.000000, 0.247059, 0.247059, 0.247059, 0.247059, 
  35.     0.247059, 0.247059, 0.247059, 0.247059, 0.498039, 0.498039, 
  36.     0.498039, 0.498039, 0.498039, 0.498039, 0.498039, 0.498039, 
  37.     0.749020, 0.749020, 0.749020, 0.749020, 0.749020, 0.749020, 
  38.     0.749020, 0.749020, 1.000000, 1.000000, 1.000000, 1.000000, 
  39.     1.000000, 1.000000, 1.000000, 1.000000, 0.000000, 0.000000, 
  40.     0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 
  41.     0.247059, 0.247059, 0.247059, 0.247059, 0.247059, 0.247059, 
  42.     0.247059, 0.247059, 0.498039, 0.498039, 0.498039, 0.498039, 
  43.     0.498039, 0.498039, 0.498039, 0.498039, 0.749020, 0.749020, 
  44.     0.749020, 0.749020, 0.749020, 0.749020, 0.749020, 0.749020, 
  45.     1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 
  46.     1.000000, 1.000000, 0.000000, 0.000000, 0.000000, 0.000000, 
  47.     0.000000, 0.000000, 0.000000, 0.000000, 0.247059, 0.247059, 
  48.     0.247059, 0.247059, 0.247059, 0.247059, 0.247059, 0.247059, 
  49.     0.498039, 0.498039, 0.498039, 0.498039, 0.498039, 0.498039, 
  50.     0.498039, 0.498039, 0.749020, 0.749020, 0.749020, 0.749020, 
  51.     0.749020, 0.749020, 0.749020, 0.749020, 1.000000, 1.000000, 
  52.     1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 
  53.     0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 
  54.     0.000000, 0.000000, 0.247059, 0.247059, 0.247059, 0.247059, 
  55.     0.247059, 0.247059, 0.247059, 0.247059, 0.498039, 0.498039, 
  56.     0.498039, 0.498039, 0.498039, 0.498039, 0.498039, 0.498039, 
  57.     0.749020, 0.749020, 0.749020, 0.749020, 0.749020, 0.749020, 
  58.     0.749020, 0.749020, 1.000000, 1.000000, 1.000000, 1.000000, 
  59.     1.000000, 1.000000, 1.000000, 1.000000, 0.000000, 0.000000, 
  60.     1.000000, 1.000000, 0.000000, 0.000000, 1.000000, 1.000000, 
  61.     0.333333, 0.443137, 0.776471, 0.556863, 0.443137, 0.219608, 
  62.     0.556863, 0.666667, 0.666667, 0.333333, 0.666667, 0.333333, 
  63.     0.666667, 0.333333, 0.666667, 0.333333, 0.666667, 0.333333, 
  64.     0.666667, 0.333333, 0.666667, 0.333333, 0.666667, 0.333333, 
  65.     0.039216, 0.078431, 0.117647, 0.156863, 0.200000, 0.239216, 
  66.     0.278431, 0.317647, 0.356863, 0.400000, 0.439216, 0.478431, 
  67.     0.517647, 0.556863, 0.600000, 0.639216, 0.678431, 0.717647, 
  68.     0.756863, 0.800000, 0.839216, 0.878431, 0.917647, 0.956863, 
  69.     0.000000, 0.141176, 0.282353, 0.427451, 0.568627, 0.713726, 
  70.     0.854902, 1.000000, 0.000000, 0.141176, 0.282353, 0.427451, 
  71.     0.568627, 0.713726, 0.854902, 1.000000, 0.000000, 0.141176, 
  72.     0.282353, 0.427451, 0.568627, 0.713726, 0.854902, 1.000000, 
  73.     0.000000, 0.141176, 0.282353, 0.427451, 0.568627, 0.713726, 
  74.     0.854902, 1.000000, 0.000000, 0.141176, 0.282353, 0.427451, 
  75.     0.568627, 0.713726, 0.854902, 1.000000, 0.000000, 0.141176, 
  76.     0.282353, 0.427451, 0.568627, 0.713726, 0.854902, 1.000000, 
  77.     0.000000, 0.141176, 0.282353, 0.427451, 0.568627, 0.713726, 
  78.     0.854902, 1.000000, 0.000000, 0.141176, 0.282353, 0.427451, 
  79.     0.568627, 0.713726, 0.854902, 1.000000, 0.000000, 0.141176, 
  80.     0.282353, 0.427451, 0.568627, 0.713726, 0.854902, 1.000000, 
  81.     0.000000, 0.141176, 0.282353, 0.427451, 0.568627, 0.713726, 
  82.     0.854902, 1.000000, 0.000000, 0.141176, 0.282353, 0.427451, 
  83.     0.568627, 0.713726, 0.854902, 1.000000, 0.000000, 0.141176, 
  84.     0.282353, 0.427451, 0.568627, 0.713726, 0.854902, 1.000000, 
  85.     0.000000, 0.141176, 0.282353, 0.427451, 0.568627, 0.713726, 
  86.     0.854902, 1.000000, 0.000000, 0.141176, 0.282353, 0.427451, 
  87.     0.568627, 0.713726, 0.854902, 1.000000, 0.000000, 0.141176, 
  88.     0.282353, 0.427451, 0.568627, 0.713726, 0.854902, 1.000000, 
  89.     0.000000, 0.141176, 0.282353, 0.427451, 0.568627, 0.713726, 
  90.     0.854902, 1.000000, 0.000000, 0.141176, 0.282353, 0.427451, 
  91.     0.568627, 0.713726, 0.854902, 1.000000, 0.000000, 0.141176, 
  92.     0.282353, 0.427451, 0.568627, 0.713726, 0.854902, 1.000000, 
  93.     0.000000, 0.141176, 0.282353, 0.427451, 0.568627, 0.713726, 
  94.     0.854902, 1.000000, 0.000000, 0.141176, 0.282353, 0.427451, 
  95.     0.568627, 0.713726, 0.854902, 1.000000, 0.000000, 0.141176, 
  96.     0.282353, 0.427451, 0.568627, 0.713726, 0.854902, 1.000000, 
  97.     0.000000, 0.141176, 0.282353, 0.427451, 0.568627, 0.713726, 
  98.     0.854902, 1.000000, 0.000000, 0.141176, 0.282353, 0.427451, 
  99.     0.568627, 0.713726, 0.854902, 1.000000, 0.000000, 0.141176, 
  100.     0.282353, 0.427451, 0.568627, 0.713726, 0.854902, 1.000000, 
  101.     0.000000, 0.141176, 0.282353, 0.427451, 0.568627, 0.713726, 
  102.     0.854902, 1.000000, 0.000000, 0.000000, 0.000000, 0.000000, 
  103.     1.000000, 1.000000, 1.000000, 1.000000, 0.333333, 0.443137, 
  104.     0.443137, 0.219608, 0.776471, 0.556863, 0.556863, 0.666667, 
  105.     0.666667, 0.333333, 0.666667, 0.333333, 0.666667, 0.333333, 
  106.     0.666667, 0.333333, 0.666667, 0.333333, 0.666667, 0.333333, 
  107.     0.666667, 0.333333, 0.666667, 0.333333, 0.039216, 0.078431, 
  108.     0.117647, 0.156863, 0.200000, 0.239216, 0.278431, 0.317647, 
  109.     0.356863, 0.400000, 0.439216, 0.478431, 0.517647, 0.556863, 
  110.     0.600000, 0.639216, 0.678431, 0.717647, 0.756863, 0.800000, 
  111.     0.839216, 0.878431, 0.917647, 0.956863, 0.000000, 0.000000, 
  112.     0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 
  113.     0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 
  114.     0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 
  115.     0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 
  116.     0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 
  117.     0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 
  118.     0.000000, 0.000000, 0.247059, 0.247059, 0.247059, 0.247059, 
  119.     0.247059, 0.247059, 0.247059, 0.247059, 0.247059, 0.247059, 
  120.     0.247059, 0.247059, 0.247059, 0.247059, 0.247059, 0.247059, 
  121.     0.247059, 0.247059, 0.247059, 0.247059, 0.247059, 0.247059, 
  122.     0.247059, 0.247059, 0.247059, 0.247059, 0.247059, 0.247059, 
  123.     0.247059, 0.247059, 0.247059, 0.247059, 0.247059, 0.247059, 
  124.     0.247059, 0.247059, 0.247059, 0.247059, 0.247059, 0.247059, 
  125.     0.498039, 0.498039, 0.498039, 0.498039, 0.498039, 0.498039, 
  126.     0.498039, 0.498039, 0.498039, 0.498039, 0.498039, 0.498039, 
  127.     0.498039, 0.498039, 0.498039, 0.498039, 0.498039, 0.498039, 
  128.     0.498039, 0.498039, 0.498039, 0.498039, 0.498039, 0.498039, 
  129.     0.498039, 0.498039, 0.498039, 0.498039, 0.498039, 0.498039, 
  130.     0.498039, 0.498039, 0.498039, 0.498039, 0.498039, 0.498039, 
  131.     0.498039, 0.498039, 0.498039, 0.498039, 0.749020, 0.749020, 
  132.     0.749020, 0.749020, 0.749020, 0.749020, 0.749020, 0.749020, 
  133.     0.749020, 0.749020, 0.749020, 0.749020, 0.749020, 0.749020, 
  134.     0.749020, 0.749020, 0.749020, 0.749020, 0.749020, 0.749020, 
  135.     0.749020, 0.749020, 0.749020, 0.749020, 0.749020, 0.749020, 
  136.     0.749020, 0.749020, 0.749020, 0.749020, 0.749020, 0.749020, 
  137.     0.749020, 0.749020, 0.749020, 0.749020, 0.749020, 0.749020, 
  138.     0.749020, 0.749020, 1.000000, 1.000000, 1.000000, 1.000000, 
  139.     1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 
  140.     1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 
  141.     1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 
  142.     1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 
  143.     1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 
  144.     1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 
  145. };
  146. float tkRGBMap[8][3] = {
  147.     {
  148.     0, 0, 0
  149.     },
  150.     {
  151.     1, 0, 0
  152.     },
  153.     {
  154.     0, 1, 0
  155.     },
  156.     {
  157.     1, 1, 0
  158.     },
  159.     {
  160.     0, 0, 1
  161.     },
  162.     {
  163.     1, 0, 1
  164.     },
  165.     {
  166.     0, 1, 1
  167.     },
  168.     {
  169.     1, 1, 1
  170.     }
  171. };
  172.  
  173. /******************************************************************************/
  174.  
  175. void tkCloseWindow(void)
  176. {
  177.  
  178.     if (xDisplay) {
  179.     cursorNum = 0;
  180.  
  181.     ExposeFunc = 0;
  182.     ReshapeFunc = 0;
  183.     IdleFunc = 0;
  184.     DisplayFunc = 0;
  185.     KeyDownFunc = 0;
  186.     MouseDownFunc = 0;
  187.     MouseUpFunc = 0;
  188.     MouseMoveFunc = 0;
  189.  
  190.     glFlush();
  191.     glFinish();
  192.     if (TK_HAS_OVERLAY(w.type)) {
  193.         XDestroyWindow(xDisplay, w.wOverlay);
  194.         glXDestroyContext(xDisplay, w.cOverlay);
  195.         XFreeColormap(xDisplay, w.cMapOverlay);
  196.         XFree((char *)w.vInfoOverlay);
  197.     }
  198.     XDestroyWindow(xDisplay, w.wMain);
  199.     glXDestroyContext(xDisplay, w.cMain);
  200.         if (w.cMapAllocated)
  201.             XFreeColormap(xDisplay, w.cMapMain);
  202.     XFree((char *)w.vInfoMain);
  203.     XCloseDisplay(xDisplay);
  204.     xDisplay = 0;
  205.     }
  206. }
  207.  
  208. /******************************************************************************/
  209.  
  210. void tkInitDisplayMode(GLenum type)
  211. {
  212.  
  213.     w.type = type;
  214. }
  215.  
  216. /******************************************************************************/
  217.  
  218. void tkInitPosition(int x, int y, int width, int height)
  219. {
  220.  
  221.     w.x = x;
  222.     w.y = y;
  223.     w.w = width;
  224.     w.h = height;
  225. }
  226.  
  227. /******************************************************************************/
  228.  
  229. static int ErrorHandler(Display *xDisplay, XErrorEvent *event)
  230. {
  231.     char buf[80];
  232.  
  233.     printf("\nReceived X error!\n");
  234.     printf("\tError code   : %d\n", event->error_code);
  235.     printf("\tRequest code : %d\n", event->request_code);
  236.     printf("\tMinor code   : %d\n\n", event->minor_code);
  237.     XGetErrorText(xDisplay, event->error_code, buf, 80);
  238.     printf("\tError text : '%s'\n\n", buf);
  239.     return 0;
  240. }
  241.  
  242. static XVisualInfo *FindMainVisual(GLenum type)
  243. {
  244.     int list[32], i;
  245.  
  246.     i = 0;
  247.  
  248.     list[i++] = GLX_LEVEL;
  249.     list[i++] = 0;
  250.  
  251.     if (TK_IS_DOUBLE(type)) {
  252.     list[i++] = GLX_DOUBLEBUFFER;
  253.     }
  254.  
  255.     if (TK_IS_RGB(type)) {
  256.     list[i++] = GLX_RGBA;
  257.     list[i++] = GLX_RED_SIZE;
  258.     list[i++] = 1;
  259.     list[i++] = GLX_GREEN_SIZE;
  260.     list[i++] = 1;
  261.     list[i++] = GLX_BLUE_SIZE;
  262.     list[i++] = 1;
  263.     if (TK_HAS_ALPHA(type)) {
  264.         list[i++] = GLX_ALPHA_SIZE;
  265.         list[i++] = 1;
  266.     }
  267.     if (TK_HAS_ACCUM(type)) {
  268.         list[i++] = GLX_ACCUM_RED_SIZE;
  269.         list[i++] = 1;
  270.         list[i++] = GLX_ACCUM_GREEN_SIZE;
  271.         list[i++] = 1;
  272.         list[i++] = GLX_ACCUM_BLUE_SIZE;
  273.         list[i++] = 1;
  274.         if (TK_HAS_ALPHA(type)) {
  275.         list[i++] = GLX_ACCUM_ALPHA_SIZE;
  276.         list[i++] = 1;
  277.         }
  278.     }
  279.     } else if (TK_IS_INDEX(type)) {
  280.     list[i++] = GLX_BUFFER_SIZE;
  281.     list[i++] = 1;
  282.     }
  283.  
  284.     if (TK_HAS_DEPTH(type)) {
  285.     list[i++] = GLX_DEPTH_SIZE;
  286.     list[i++] = 1;
  287.     }
  288.  
  289.     if (TK_HAS_STENCIL(type)) {
  290.     list[i++] = GLX_STENCIL_SIZE;
  291.     list[i++] = 1;
  292.     }
  293.  
  294.     list[i] = (int)None;
  295.  
  296.     return glXChooseVisual(xDisplay, xScreen, list);
  297. }
  298.  
  299. static XVisualInfo *FindOverlayVisual(void)
  300. {
  301.     int list[10];
  302.  
  303.     list[0] = GLX_LEVEL;
  304.     list[1] = 1;
  305.     list[2] = (int)None;
  306. /*
  307.     list[2] = GLX_TRANSPARENT_TYPE;
  308.     list[3] = GLX_TRANSPARENT_INDEX;
  309.     list[4] = None;
  310. */
  311.     return glXChooseVisual(xDisplay, xScreen, list);
  312. }
  313.  
  314. static GLenum GetMainWindowType(XVisualInfo *vi)
  315. {
  316.     GLenum mask;
  317.     int x, y, z;
  318.  
  319.     mask = 0;
  320.  
  321.     glXGetConfig(xDisplay, vi, GLX_DOUBLEBUFFER, &x);
  322.     if (x) {
  323.     mask |= TK_DOUBLE;
  324.     } else {
  325.     mask |= TK_SINGLE;
  326.     }
  327.  
  328.     glXGetConfig(xDisplay, vi, GLX_RGBA, &x);
  329.     if (x) {
  330.     mask |= TK_RGB;
  331.     glXGetConfig(xDisplay, vi, GLX_ALPHA_SIZE, &x);
  332.     if (x > 0) {
  333.         mask |= TK_ALPHA;
  334.     }
  335.     glXGetConfig(xDisplay, vi, GLX_ACCUM_RED_SIZE, &x);
  336.     glXGetConfig(xDisplay, vi, GLX_ACCUM_GREEN_SIZE, &y);
  337.     glXGetConfig(xDisplay, vi, GLX_ACCUM_BLUE_SIZE, &z);
  338.     if (x > 0 && y > 0 && z > 0) {
  339.         mask |= TK_ACCUM;
  340.     }
  341.     } else {
  342.     mask |= TK_INDEX;
  343.     }
  344.  
  345.     glXGetConfig(xDisplay, vi, GLX_DEPTH_SIZE, &x);
  346.     if (x > 0) {
  347.     mask |= TK_DEPTH;
  348.     }
  349.  
  350.     glXGetConfig(xDisplay, vi, GLX_STENCIL_SIZE, &x);
  351.     if (x > 0) {
  352.     mask |= TK_STENCIL;
  353.     }
  354.  
  355.     if (glXIsDirect(xDisplay, w.cMain)) {
  356.     mask |= TK_DIRECT;
  357.     } else {
  358.     mask |= TK_INDIRECT;
  359.     }
  360.  
  361.     return mask;
  362. }
  363.  
  364. static int WaitForMainWindow(Display *d, XEvent *e, char *arg)
  365. {
  366.  
  367.     if (e->type == MapNotify && e->xmap.window == w.wMain) {
  368.     return GL_TRUE;
  369.     } else {
  370.     return GL_FALSE;
  371.     }
  372. }
  373.  
  374. static int WaitForOverlayWindow(Display *d, XEvent *e, char *arg)
  375. {
  376.  
  377.     if (e->type == MapNotify && e->xmap.window == w.wOverlay) {
  378.     return GL_TRUE;
  379.     } else {
  380.     return GL_FALSE;
  381.     }
  382. }
  383.  
  384. GLenum tkInitWindow(char *title)
  385. {
  386.     XSetWindowAttributes wa;
  387.     XTextProperty tp;
  388.     XSizeHints sh;
  389.     XEvent e;
  390.     int erb, evb;
  391.     GLenum overlayFlag;
  392.  
  393.     if (!xDisplay) {
  394.     xDisplay = XOpenDisplay(0);
  395.     if (!xDisplay) {
  396.         fprintf(stderr, "Can't connect to xDisplay!\n");
  397.         return GL_FALSE;
  398.     }
  399.     if (!glXQueryExtension(xDisplay, &erb, &evb)) {
  400.         fprintf(stderr, "No glx extension!\n");
  401.         return GL_FALSE;
  402.     }
  403.     xScreen = DefaultScreen(xDisplay);
  404.     wRoot = RootWindow(xDisplay, xScreen);
  405.     XSetErrorHandler(ErrorHandler);
  406.     }
  407.  
  408.     if (TK_HAS_OVERLAY(w.type)) {
  409.     overlayFlag = GL_TRUE;
  410.     } else {
  411.     overlayFlag = GL_FALSE;
  412.     }
  413.     w.type &= ~TK_OVERLAY;
  414.  
  415.     w.vInfoMain = FindMainVisual(w.type);
  416.     if (!w.vInfoMain) {
  417.        if (TK_IS_RGB(w.type)) {
  418.       fprintf(stderr, "Couldn't find visual for RGB mode!\n");
  419.        }
  420.        else {
  421.       fprintf(stderr, "Couldn't find visual for Color Index mode!\n");
  422.        }
  423.        xDisplay = 0;  /* to prevent crash in tkCloseWindow */
  424.        return GL_FALSE;
  425.     }
  426.  
  427.     w.cMain = glXCreateContext(xDisplay, w.vInfoMain, None,
  428.                    (TK_IS_DIRECT(w.type))?GL_TRUE:GL_FALSE);
  429.     if (!w.cMain) {
  430.     fprintf(stderr, "Can't create a context!\n");
  431.     return GL_FALSE;
  432.     }
  433.  
  434.     w.type = GetMainWindowType(w.vInfoMain);
  435.  
  436.     w.cMapAllocated = 1;
  437.     if (TK_IS_INDEX(w.type)) {
  438.         /* Color Indexed windows needs a writable colormap */
  439.     if (w.vInfoMain->class != StaticColor &&
  440.         w.vInfoMain->class != StaticGray) {
  441.         w.cMapMain = XCreateColormap(xDisplay, wRoot, w.vInfoMain->visual,
  442.                          AllocAll);
  443.     } else {
  444.         w.cMapMain = XCreateColormap(xDisplay, wRoot, w.vInfoMain->visual,
  445.                          AllocNone);
  446.     }
  447.     } else {
  448.         /* RGB colormap is AllocNone, share the root colormap if possible */
  449.     Screen *scr = DefaultScreenOfDisplay(xDisplay);
  450.     int scrnum = DefaultScreen(xDisplay);
  451.     if (MaxCmapsOfScreen(scr)==1
  452.         && w.vInfoMain->visual==DefaultVisual(xDisplay,scrnum)) {
  453.        /* the window and root are of the same visual type */
  454.        char *private_cmap = getenv("MESA_PRIVATE_CMAP");
  455.        if (private_cmap) {
  456.           /* user doesn't want to share colormaps */
  457.           w.cMapMain = XCreateColormap(xDisplay, wRoot,
  458.                        w.vInfoMain->visual, AllocNone);
  459.        }
  460.        else {
  461.           /* share the root colormap */
  462.           w.cMapMain = DefaultColormap(xDisplay,scrnum);
  463.        }
  464.     }
  465.     else {
  466.        /* window and root are different visual types, allocate new cmap */
  467. /****  ad@lms.be:  Added initialization for HP color recovery  *******/
  468.            Atom hp_cr_maps = XInternAtom(xDisplay, "_HP_RGB_SMOOTH_MAP_LIST", True);
  469.            w.cMapMain = 0;
  470.            if (hp_cr_maps) {
  471.                 XStandardColormap* colmaps = 0;
  472.                 int nrColmaps = 0;
  473.                 int i;
  474.                 XGetRGBColormaps( xDisplay, RootWindow(xDisplay, scrnum)
  475.                                 , &colmaps, &nrColmaps, hp_cr_maps);
  476.                 for (i=0; i<nrColmaps; i++) {
  477.                     if (colmaps[i].visualid == w.vInfoMain->visual->visualid) {
  478.                         w.cMapMain = colmaps[i].colormap;
  479.                         w.cMapAllocated = 0;
  480.                         break;
  481.                     }
  482.                 }
  483.            }  /*** end HP color recovery ***/
  484.            if (!w.cMapMain) {
  485.                if (w.vInfoMain->class==DirectColor) {
  486.                   w.cMapMain = XCreateColormap(xDisplay, wRoot,
  487.                                                w.vInfoMain->visual, AllocAll);
  488.                }
  489.                else {
  490.                   w.cMapMain = XCreateColormap(xDisplay, wRoot,
  491.                                                w.vInfoMain->visual, AllocNone);
  492.                }
  493.            }
  494.     }
  495.     }
  496.     if (TK_IS_INDEX(w.type) || w.vInfoMain->class==DirectColor) {
  497.        tkSetRGBMap(256, colorMaps);
  498.     }
  499.     wa.colormap = w.cMapMain;
  500.     wa.background_pixmap = None;
  501.     wa.border_pixel = 0;
  502.     wa.event_mask = StructureNotifyMask | ExposureMask | KeyPressMask |
  503.             ButtonPressMask | ButtonReleaseMask | PointerMotionMask;
  504.     w.wMain = XCreateWindow(xDisplay, wRoot, w.x, w.y, w.w, w.h, 0,
  505.                 w.vInfoMain->depth, InputOutput,
  506.                 w.vInfoMain->visual,
  507.                 CWBackPixmap|CWBorderPixel|CWEventMask|CWColormap,
  508.                 &wa);
  509.  
  510.     /*OLD: XInstallColormap( xDisplay, w.cMapMain );*/
  511.     XSetWMColormapWindows( xDisplay, w.wMain, &w.wMain, 1 );
  512.  
  513.     XStringListToTextProperty(&title, 1, &tp);
  514.     sh.flags = USPosition | USSize;
  515.     XSetWMProperties(xDisplay, w.wMain, &tp, &tp, 0, 0, &sh, 0, 0);
  516.     XFree(tp.value);
  517.     deleteWindowAtom = XInternAtom(xDisplay, "WM_DELETE_WINDOW", False);
  518.     XSetWMProtocols(xDisplay, w.wMain, &deleteWindowAtom, 1);
  519.     XMapWindow(xDisplay, w.wMain);
  520.     drawAllowFlag = GL_FALSE;
  521.     XIfEvent(xDisplay, &e, WaitForMainWindow, 0);
  522.  
  523.     if (overlayFlag == GL_TRUE) {
  524.     w.vInfoOverlay = FindOverlayVisual();
  525.     if (w.vInfoOverlay) {
  526.         w.cOverlay = glXCreateContext(xDisplay, w.vInfoOverlay, None,
  527.                       GL_TRUE);
  528.         w.cMapOverlay = XCreateColormap(xDisplay, wRoot,
  529.                         w.vInfoOverlay->visual,AllocNone);
  530.         tkSetOverlayMap(256, colorMaps);
  531.         wa.colormap = w.cMapOverlay;
  532.         wa.background_pixmap = None;
  533.         wa.border_pixel = 0;
  534.         w.wOverlay = XCreateWindow(xDisplay, w.wMain, 0, 0, w.w, w.h, 0,
  535.                        w.vInfoOverlay->depth, InputOutput,
  536.                        w.vInfoOverlay->visual,
  537.                        CWBackPixmap|CWBorderPixel|CWColormap,
  538.                        &wa);
  539.         XMapWindow(xDisplay, w.wOverlay);
  540.         XSetWMColormapWindows(xDisplay, w.wMain, &w.wOverlay, 1);
  541.         w.type |= TK_OVERLAY;
  542.     } else {
  543.         fprintf(stderr, "Can't create a overlay plane!\n");
  544.     }
  545.     }
  546.  
  547.     if (!glXMakeCurrent(xDisplay, w.wMain, w.cMain)) {
  548.     fprintf(stderr, "Can't make window current drawable!\n");
  549.     return GL_FALSE;
  550.     }
  551.     XFlush(xDisplay);
  552.  
  553.     return GL_TRUE;
  554. }
  555.  
  556. /******************************************************************************/
  557.  
  558. void tkQuit(void)
  559. {
  560.  
  561.     tkCloseWindow();
  562.     exit(0);
  563. }
  564.  
  565. /******************************************************************************/
  566.  
  567. void tkSwapBuffers(void)
  568. {
  569.  
  570.     if (xDisplay) {
  571.     glXSwapBuffers(xDisplay, w.wMain);
  572.     }
  573. }
  574.  
  575. /******************************************************************************/
  576.